package cn.edu.tju.elm.repository.wallet;

import cn.edu.tju.elm.model.wallet.WalletRule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

@Repository
public interface WalletRuleRepository extends JpaRepository<WalletRule, Long> {
    /**
     * 根据规则类型查找所有激活的规则
     */
    List<WalletRule> findByRuleTypeAndIsActiveTrue(String ruleType);

    /**
     * 查找所有激活的规则
     */
    List<WalletRule> findByIsActiveTrue();

    /**
     * 根据规则类型和条件查询
     */
    List<WalletRule> findByRuleTypeAndConditionValue(String ruleType, BigDecimal conditionValue);

    /**
     * 查找适用于指定金额的充值规则（条件 <= 金额）
     */
    @Query("SELECT wr FROM WalletRule wr WHERE wr.ruleType = 'DEPOSIT' AND wr.isActive = true AND wr.conditionValue <= :amount ORDER BY wr.conditionValue DESC")
    List<WalletRule> findApplicableDepositRules(@Param("amount") BigDecimal amount);
    
    /**
     * 查找激活的提现规则
     */
    Optional<WalletRule> findByRuleTypeAndIsActiveTrueOrderByIdDesc(String ruleType);

    /** 
     * 检查指定类型的规则是否存在
     */
    boolean existsByRuleTypeAndIsActiveTrue(String ruleType);

    /**
     * 根据规则名称查找规则
     */
    Optional<WalletRule> findByRuleName(String ruleName);

    /**
     * 根据规则类型查找规则（不区分激活状态）
     */
    List<WalletRule> findByRuleType(String ruleType);

    /**
     * 查找条件值大于指定值的规则
     */
    List<WalletRule> findByConditionValueGreaterThan(BigDecimal conditionValue);

    /**
     * 查找条件值小于指定值的规则
     */
    List<WalletRule> findByConditionValueLessThan(BigDecimal conditionValue);

    /**
     * 查找规则值大于指定值的规则
     */
    List<WalletRule> findByRuleValueGreaterThan(BigDecimal ruleValue);

    /**
     * 查找规则值小于指定值的规则
     */
    List<WalletRule> findByRuleValueLessThan(BigDecimal ruleValue);

    /**
     * 统计激活规则数量
     */
    long countByIsActiveTrue();

    /**
     * 统计指定类型的规则数量
     */
    long countByRuleType(String ruleType); 
}
